<?php
/**
 * Конфигурационный объект для настройки объекта класса Arm_Db_Tree_Nested
 *
 * @category   X
 * @package    Arm_Db
 * @subpackage Arm_Db_Tree
 * @author     nrnwest@gmail.com
 * @programing   Стешенко Александр (lcfsoft@gmail.com)
 * @version    0.1
 */
class Arm_Db_Tree_Nested_Params
{
    /**
     * Идентификатор дерева
     *
     * @var integer
     */
    private $_treeId = 1;
    
    /**
     * Тип возвращаемых данных
     * false - возвращение объектов Zend_Db_Select
     * true - возвращение массивов данных
     *
     * @var boolean
     */
    private $_returnType = false;

    /**
     * Соотвествия "имя таблицы" => "колонка идентификатор"
     * для осуществления синхронного удаления даных
     * из связанных таблиц
     *
     * @var array
     */
    private $_callbackDelete = array();
    
    /**
     * Псевдонимы для колонок структурной таблицы
     *
     * @var array
     */
    private $_asColumns = array(
        'id'         => 'id',
        'tree_id'    => 'tree_id',
        'left_key'   => 'left_key',
        'right_key'  => 'right_key',
        'level'      => 'level'
    );
    
    //TODO: добавить в спецификацию данное поле
    /**
     * Колонки структурной таблицы
     *
     * @var unknown_type
     */
    private $_columns = array(
        'id'         => 'id',
        'tree_id'    => 'tree_id',
        'left_key'   => 'left_key',
        'right_key'  => 'right_key',
        'level'      => 'level'
    );
    /**
     * Конструктор
     *
     * @param array $params Параметры
     */
    public function __construct($params = array())
    {
        if (isset($params['treeId'])) {
            $this->setTreeId($params['treeId']);
        }
        if (isset($params['returnType'])) {
            $this->setReturnType($params['returnType']);
        }
        if (isset($params['callbackDelete'])) {
            $this->setCallbackDelete($params['callbackDelete']);
        }
        if (isset($params['asColumns'])) {
            $this->setAsColumns($params['asColumns']);
        }
    }
    
    /**
     * Установка идентификаторая дерева
     *
     * @param int $treeId Идентификатор дерева
     */
    public function setTreeId($treeId)
    {
        $treeId = (int) $treeId;
        // В случае передачи неверных данных генерируется исключение
        if ($treeId <= 0) {
            throw new Arm_Db_Tree_Nested_Exception('Параметр treeId должен'
        	    . ' быть положительным целым числом, ' . $treeId . ' передан');
        }
        $this->_treeId = $treeId;
    }
    
    /**
     * Устанавливает тип возвращаемых данных
     * false - возвращение объектов Zend_Db_Select
     * true - возвращение массивов данных
     *
     * @param boolean $returnType Тип возвращаемых данных
     */
    public function setReturnType($returnType = false)
    {
        $this->_returnType = $returnType ? true : false;
    }
    
    /**
     * Установка связи названия таблицы с данными и ключа идентификатора
     * из этой таблицы для синхронного удаления данных из дерева и из
     * таблицы с данными
     *
     * @param array $callbackDelete
     */
    public function setCallbackDelete($callbackDelete = array())
    {
        if (!is_array($callbackDelete)) {
            throw new Arm_Db_Tree_Nested_Exception('Параметр asColumns должен '
                . 'быть массивом, ' . gettype($callbackDelete) . ' передан.');
        }
        
        $this->_callbackDelete = $callbackDelete;
    }
    
    /**
     * Установка полей структурной таблицы
     *
     * @param array $columns
     */
    public function setColumns($columns)
    {
        if (!is_array($columns)) {
            throw new Arm_Db_Tree_Nested_Exception('Параметр columns должен '
                . 'быть массивом, ' . gettype($columns) . ' передан.');
        }
        
        $this->_columns = $columns;
    }
    
    /**
     * Устноавка названия столбца в котором содержаться id дерева(деревьев)
     * @param string $column пля примера id_menu - таблица может содержать множество деревьев
     */
    public function  setColumnTreeID($column)
    {
      $this->_columns['tree_id']   = $column;
      $this->_asColumns['tree_id'] = $column;
      return;
    }
    
    /**
     * Установка псевдонимов для полей структурной таблицы
     *
     * @param array $asColumns
     */
    public function setAsColumns($asColumns)
    {
        if (!is_array($asColumns)) {
            throw new Arm_Db_Tree_Nested_Exception('Параметр asColumns должен '
                . 'быть массивом, ' . gettype($asColumns) . ' передан.');
        }
        
        $this->_asColumns = $asColumns;
    }
    
    /**
     * Получение активного идентификатора дерева
     *
     * @return int
     */
    public function getTreeId()
    {
        return $this->_treeId;
    }
    
    /**
     * Возвращает формат получаемых данных
     * false - если Zend_Db_Select
     * true - если массив
     *
     * @return array|Zend_Db_Select
     */
    public function getReturnType()
    {
        return $this->_returnType;
    }

    /**
     * Получение массива с идентификаторами связанных таблиц
     * для синхронного удаления элементов из дерева
     *
     * @return array
     */
    public function getCallbackDelete()
    {
        return $this->_callbackDelete;
    }
    
    /**
     * Получение массива с пвседонимами для полей структурной таблицы
     *
     * @return array
     */
    public function getAsColumns()
    {
        return $this->_asColumns;
    }
    
    /**
     * Получение массива с полями структурной таблицы
     *
     * @return array
     */
    public function getColumns()
    {
        return $this->_columns;
    }

    /**
     * Получение поля в структурной таблице по его ключу.
     *
     * Ключ поля может принимать одно из следующих значений:
     * id        - идентификатор элемента, первичный ключ
     * tree_id   - идентификатор дерева
     * left_key  - левый ключ
     * right_key - правый ключ
     * level     - уровень вложенности элемента
     *
     * @param string $columnKey
     * @return string
     */
    public function getColumn($columnKey)
    {
        if (!isset($this->_columns[$columnKey])) {
            throw new Arm_Db_Tree_Nested_Exception('Поле ' . $columnKey . ' не '
                . 'найдено в списке полей');
        }
        
        return $this->_columns[$columnKey];
    }
    
    /**
     * Получение алиаса для поля структурной таблицы по ключу поля
     *
     * Ключ поля может принимать одно из следующих значений:
     * id        - идентификатор элемента, первичный ключ
     * tree_id   - идентификатор дерева
     * left_key  - левый ключ
     * right_key - правый ключ
     * level     - уровень вложенности элемента
     *
     * @param string $columnKey
     * @return string
     */
    public function getColumnAlias($columnKey)
    {
        if (!isset($this->_asColumns[$columnKey])) {
            throw new Arm_Db_Tree_Nested_Exception('Поле ' . $columnKey . ' не '
                . 'найдено в списке полей');
        }
        
        return $this->_asColumns[$columnKey];
    }
}